/******************************************************************************中
 * @brief: eth task
 * @Author: aple
 * @Date: 2022-12-14 12:37:50
 * @LastEditors: aple
 * @LastEditTime: 2022-12-14 12:41:45
 * @Verision: 1.0.0.0
 ******************************************************************************/
#include "framework.h"
#include "eth_task.h"
#include "client/tcp_client_app.h"

/*****************************************************************************
 * @brief   const
 *****************************************************************************/

/*****************************************************************************
 * @brief   function
 *****************************************************************************/
static error_t client_init(void);
static void client_deinit(void);
static void etcp_client_handle(void);

/*****************************************************************************
 * @brief   Global var
 *****************************************************************************/
TcpAppClientContext etcp_client_context;

/*****************************************************************************
 * @brief   loacal var
 *****************************************************************************/

/*****************************************************************************
 * @brief   task var
 *****************************************************************************/

/*******************************************************************************
 * @brief: TcpApp config default
 ******************************************************************************/
void eth_client_app_task(void const *argument);
osThreadDef(eth_client_app_task, osPriorityNormal, 1, 0x400);
static osThreadId_t task_id;

/*******************************************************************************
 * @brief: var
 ******************************************************************************/

/*******************************************************************************
 * @brief: eth TcpApp init
 * @param void
 * @return {*}
 ******************************************************************************/
void eth_client_app_task(void const *argument)
{
	osDelay(500);
	
	// init
	while(client_init() != NO_ERROR)
	{
		osDelay(100);
	}
	
	// connect ok
	while(1)
	{
		osDelay(100);
		etcp_client_handle();
	}
}

/*******************************************************************************
 * @brief: eth TcpApp init
 * @param void
 * @return {*}
 ******************************************************************************/
void etcp_client_init(void)
{
	task_id = osThreadCreate(osThread(eth_client_app_task), NULL);
}


void etcp_client_deinit(void)
{
	client_deinit();
	
	osThreadTerminate(task_id);
}

/*******************************************************************************
 * @brief: client link
 * @param void
 * @return {*}
 ******************************************************************************/
static error_t client_init(void)
{
	error_t error;
	
	IpAddr ip;
	
	do 
	{
		error = TcpAppClientInit(&etcp_client_context);
		if(error != NO_ERROR)
			break;
		
		error = TcpAppClientSetTimeout(&etcp_client_context, TCP_APP_CLIENT_DEFAULT_TIMEOUT);
		if(error != NO_ERROR)
			break;
		
		error = TcpAppClientBindToInterface(&etcp_client_context, &netInterface[0]);
		if(error != NO_ERROR)
			break;
		
		ip.length = 4;
		ip.addr[0] = 192;
		ip.addr[1] = 168;
		ip.addr[2] = 1;
		ip.addr[3] = 5;
		error = TcpAppClientConnect(&etcp_client_context, &ip, TCP_APP_TCP_CLIENT_PORT);
	} while(0);
	
	return error;
}

static void client_deinit(void)
{
    TcpAppClientDisconnect(&etcp_client_context);
    TcpAppClientClose(&etcp_client_context);
	TcpAppClientDeinit(&etcp_client_context);
}

/*******************************************************************************
 * @brief: eth TcpApp deinit
 * @param void
 * @return {*}
 ******************************************************************************/
void etcp_client_handle(void)
{
	static int cnt = 0;
	char buff[32];
	uu08 resp[256+16];
	size_t resp_len;
	
	// 每0.8s发一包数据，无响应请求
	if((cnt & 7) == 0)
	{
		sprintf(buff, "send cnt : %d\n", cnt);
		TcpAppClientUserSendData(&etcp_client_context, (uint8_t *)buff, strlen(buff), EXT_FALSE);
		
		if(etcp_client_context.responseAduLen)
		{
			
		}
	}
	cnt++;
	
	// 非阻塞读取连接数据
	TcpAppClientReadResp(&etcp_client_context, resp, sizeof(resp) - 16, &resp_len);
	
	// 处理回显
	if(resp_len)
	{
		strcpy((char*)&resp[resp_len], "++++\n\n\n");
		TcpAppClientUserSendData(&etcp_client_context, (uint8_t *)resp, resp_len + 5, EXT_FALSE);
	}
	
}
